package main

import "fmt"

/* 判断一个数是不是2的n次方*/
func main(){
	data := 34
	res := function2(data)
	fmt.Println(res, ^-4 + 1)

}

// 方法一个就是对1进行位上的左移，每移一位就是乘一个2
func function1(n int ) bool {
	if n <= 0 {
		return false
	}

	for i:= 1; i<32;i++{
		tmp := 1<<i
		if tmp == n {
			return true
		}else if tmp<n {
			continue
		}else{
			return false
		}
	}
	return false
}

// 第二个方法就是位操作。
// 使用这个方法的前提是你要明白，与操作只有全是1 的时候才会是1,除此之外全部都是0
// 然后我们考虑一个，2的n次方有什么特点。
// 2^0 = 1->1 ; 2^1 = 2 -> 10; 2^2=4 -> 100 ......
// 如上规律是什么？当然是只要是2的n次方，那么得到的2进制数一定只有1个1 剩下的都是0
// 根据与操作的特点，我们只要用一个数和他前一个数相与，如果得0 就是2的n次方，如果不是0,那么就不是2的n次方。
func function2(n int) bool {
	if n < 1 {
		return false
	}
	if n & (n-1) == 0 {
		return true
	}
	return false
}